package kr.pe.johnkim.waiting.mobile.dao;

import kr.pe.johnkim.waiting.mobile.domain.WaitingUser;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * Waiting 사용자 관련 dao 구현 클래스 이다.
 *
 * @author : John_Kim <cale9797@gmail.com>
 * @date : 13. 4. 10.
 */
@Repository
public class WaitingUserDaoImpl extends SqlSessionDaoSupport implements WaitingUserDao {

    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(WaitingUserDaoImpl.class);

    /**
     * 이미 등록된 사용자 대기가 있는지 확인한다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectDuplicationUser(WaitingUser waitingUser) {
        logger.info("selectDuplicationUser");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectDuplicationUser", waitingUser);
    }

    /**
     * 사용자가 대기 등록된 가맹점의 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserMerchantInformation(WaitingUser waitingUser) {
        logger.info("selectUserMerchantInformation");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserMerchantInformation", waitingUser);
    }

    /**
     * (오늘) 다음 대기번호를 가져 온다.
     * 한번 대기 등록되었던 갯수를 모두 가져 온다.
     * 이 숫자에 1을 더해서 대기번호로 사용 한다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectNumberWaiting(WaitingUser waitingUser) {
        logger.info("selectNumberWaiting");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectNumberWaiting", waitingUser);
    }

    /**
     * 대기를 등록 한다.
     *
     * @param waitingUser
     */
    @Override
    public void registerUser(WaitingUser waitingUser) {
        logger.info("registerUser");
        this.getSqlSession().insert("WAITING_USERS.registerUser", waitingUser);
    }

    /**
     * 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserInformation(WaitingUser waitingUser) {
        logger.info("selectUserInformation");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserInformation", waitingUser);
    }

    /**
     * 사용자 id 로 등록된 대기 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserInformationById(WaitingUser waitingUser) {
        logger.info("selectUserInformationById");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserInformationById", waitingUser);
    }

    /**
     * 대기를 취소 한다. 대기를 등록했다가 취소하는 경우 비활성화 한다.
     *
     * @param waitingUser
     */
    @Override
    public void updateDeactivateUser(WaitingUser waitingUser) {
        logger.info("updateDeactivateUser");
        this.getSqlSession().update("WAITING_USERS.updateDeactivateUser", waitingUser);
    }

    /**
     * 대기 목록을 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public List<WaitingUser> selectUserList(WaitingUser waitingUser) {
        logger.info("selectUserList");
        return this.getSqlSession().selectList("WAITING_USERS.selectUserList", waitingUser);
    }

    /**
     * (오늘) 총 대기 인원 숫자를 가져 온다. iPad 에 출력 한다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserTotalCount(WaitingUser waitingUser) {
        logger.info("selectUserTotalCount");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserTotalCount", waitingUser);
    }

    /**
     * 현재 대기자를 입장 처리 한다.
     *
     * @param waitingUser
     */
    @Override
    public void updateUserAdmissionYn(WaitingUser waitingUser) {
        logger.info("updateUserAdmissionYn");
        this.getSqlSession().update("WAITING_USERS.updateUserAdmissionYn", waitingUser);
    }

    /**
     * 다음 대기자의 next_turn_yn 의 값을 'Y' 로 업데이트 한다.
     *
     * @param waitingUser
     */
    @Override
    public void updateUserNextTurnYn(WaitingUser waitingUser) {
        logger.info("updateUserNextTurnYn");
        this.getSqlSession().update("WAITING_USERS.updateUserNextTurnYn", waitingUser);
    }

    /**
     * 다음 대기자를 찾는다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserNextTurn(WaitingUser waitingUser) {
        logger.info("selectUserNextTurn");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserNextTurn", waitingUser);
    }

    /**
     * 내 앞으로 남은 대기자 총 수를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectRemainUserTotalCountBeforeMe(WaitingUser waitingUser) {
        logger.info("selectRemainUserTotalCountBeforeMe");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectRemainUserTotalCountBeforeMe", waitingUser);
    }

    /**
     * 사용자가 대기 등록된 적이 있었는지 확인한다.
     * 추천 로직에서 사용한다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public WaitingUser selectUserRegistered(WaitingUser waitingUser) {
        logger.info("selectUserRegistered");
        return (WaitingUser)this.getSqlSession().selectOne("WAITING_USERS.selectUserRegistered", waitingUser);
    }

    /**
     * 오늘 총 등록팀과 등록인원 정보를 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public List<WaitingUser> selectRegisterTeamAndUser(WaitingUser waitingUser) {
        logger.info("selectRegisterTeamAndUser");
        return this.getSqlSession().selectList("WAITING_USERS.selectRegisterTeamAndUser", waitingUser);
    }

    /**
     * 오늘 가장 최근에 등록/입장한 고객 2팀의 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public List<WaitingUser> selectRecentAdmissionUserList(WaitingUser waitingUser) {
        logger.info("selectRecentAdmissionUserList");
        return this.getSqlSession().selectList("WAITING_USERS.selectRecentAdmissionUserList", waitingUser);
    }

    /**
     * 오늘 등록/입장한 고객 목록을 가져 온다.
     *
     * @param waitingUser
     * @return
     */
    @Override
    public List<WaitingUser> selectTodayAdmissionUserList(WaitingUser waitingUser) {
        logger.info("selectTodayAdmissionUserList");
        return this.getSqlSession().selectList("WAITING_USERS.selectTodayAdmissionUserList", waitingUser);
    }
}
